package c;

import java.awt.Component;
import java.awt.event.KeyEvent;
import javax.swing.JCheckBox;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.*;

import clases.ButtonEditor;
import clases.ButtonRenderer;
import core.constructor.constructor;
import java.awt.event.KeyListener;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import m.JXTableModel;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.decorator.Highlighter;
import org.jdesktop.swingx.decorator.HighlighterFactory;

public class GridTableController extends Controller {

    private JXTable dev_tabla;
    private DefaultTableModel modeloT;

    public GridTableController(JXTable tablaImplementacion) {
        dev_tabla = tablaImplementacion;
    }

   public JXTable setTabla(JXTable tablaImplementacion , String sqlTabla , String titulosColumas, constructor c) {
        dev_tabla = tablaImplementacion;
        modeloT = new DefaultTableModel();
        
        JXTableModel t = new JXTableModel();
       
        //Enviar Primero los titulos y luego la SQL
        setModeloTabla(t.datosTabla(titulosColumas,sqlTabla),c);

        //dev_tabla = autoResizeColWidth(dev_tabla, modeloT);
        return dev_tabla;
    }
   
   
   //este es un metodo de clase que recibe el textfield que se usa para buscar
   public void  setFilter(final JTextField search){
       final TableRowSorter<TableModel> sorter = 
               (TableRowSorter<TableModel>) dev_tabla.getRowSorter();
       
       search.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
            }

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            
            public void keyReleased(KeyEvent e) {
                String text = search.getText();
                if (text.length() == 0) {
                    sorter.setRowFilter(null);
                } else {
                    try {
                        List<RowFilter<Object, Object>> rfs =
                                new ArrayList<RowFilter<Object, Object>>(2);
                        
                        //si se desea que muestre solo lo que empieza con lo escrito
                        rfs.add(RowFilter.regexFilter("^" + text.toUpperCase()));
                        rfs.add(RowFilter.regexFilter("^" + text.toLowerCase()));
                        
                        //muestra las filas que tengan los caracteres digitados, en alguna parte
                        //de cualquier columna
//                        rfs.add(RowFilter.regexFilter(text.toUpperCase()));
//                        rfs.add(RowFilter.regexFilter(text.toLowerCase()));
                        sorter.setRowFilter(
                                RowFilter.orFilter(rfs));
                    } catch (PatternSyntaxException pse) {
                        System.err.println("Bad regex pattern");
                    }
                }
            }
        });
   }
   
   //o este es un metodo estatico que recibe el textfield y la tabla,
   //como seleccionadorUI no usa esta clase, toca de esta forma
   //no se si dejar los dos
    public static void setFilterStatic(final JTextField search, JXTable table) {
        final TableRowSorter<TableModel> sorter =
                (TableRowSorter<TableModel>) table.getRowSorter();

        search.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
            }

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
                String text = search.getText();
                if (text.length() == 0) {
                    sorter.setRowFilter(null);
                } else {
                    try {
                        List<RowFilter<Object, Object>> rfs =
                                new ArrayList<RowFilter<Object, Object>>(2);
                      
                        //si se desea que muestre solo lo que empieza con lo escrito
                        //rfs.add(RowFilter.regexFilter(text));
                        rfs.add(RowFilter.regexFilter("^" + text.toUpperCase()));
                        rfs.add(RowFilter.regexFilter("^" + text.toLowerCase()));

                        //muestra las filas que tengan los caracteres digitados, en alguna parte
                        //de cualquier columna
//                        rfs.add(RowFilter.regexFilter(text.toUpperCase()));
//                        rfs.add(RowFilter.regexFilter(text.toLowerCase()));
                        sorter.setRowFilter(
                                RowFilter.orFilter(rfs));
                    } catch (PatternSyntaxException pse) {
                        System.err.println("Bad regex pattern");
                    }
                }
            }
        });
    }
   
   
    /**
     * Asigna un Modelo a la Tabla
     * y trae de la Clase Consultar Munucipios
     * Los vectores que tendra la JTable.
     */
    public void setModeloTabla(Object[] ed_RegistrosTabla, constructor c) {

        //BVerTodos.setVisible(mostrar);

        //Se instancia el Modelo de la Tabla
        DefaultTableModel ed_modeloTabla = new DefaultTableModel();

        //Se instancia la Clase que hara la logica de la Consulta
        //Clientes cliente = new Clientes();

        Object[] ed_datosVector = ed_RegistrosTabla;
        
       

        ed_modeloTabla.setDataVector((Object[][]) ed_datosVector[1], (Object[]) ed_datosVector[0]);

        //Se Aplica el Modelo a la Tabla
        dev_tabla.setModel(ed_modeloTabla);

        //Alto de las Filas
        dev_tabla.setRowHeight(24);

        // Permitir solo una seleccion por vez
        dev_tabla.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);

        // Bloquear columnas
        dev_tabla.getTableHeader().setReorderingAllowed(false);



        //Hacer Que tabla se tenga ordenamiento. http://chuwiki.chuidiang.org/index.php?title=JTable:_Ordenar_y_filtrar_filas
        // Instanciamos el TableRowSorter y lo añadimos al JTable
        TableRowSorter<TableModel> columOrdenamiento = new TableRowSorter<TableModel>(ed_modeloTabla);
        dev_tabla.setRowSorter(columOrdenamiento);



        //TableColumn columna = dev_tabla.getColumn("Codigo");

        //columna.setPreferredWidth(70);


        //Desactivar el AutoResize para que tome un Ancho definido
        dev_tabla.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);


        /**
        Eliminar una columna de la tabla(ocultar) pero visible para el modelo
         * ed_Tabla.removeColumn(ed_Tabla.getColumn("Eliminar"));
         **/
        
        
//        dev_tabla.getColumn("Consultar").setCellRenderer(new ButtonRenderer("/core/img/tablaconsult.png"));
//        dev_tabla.getColumn("Consultar").setCellEditor(
//                new ButtonEditor(new JCheckBox(), "/core/img/tablaconsult.png", dev_tabla, c));
//
//
//        dev_tabla.getColumn("Modificar").setCellRenderer(new ButtonRenderer("/core/img/tablaactu.png"));
//        dev_tabla.getColumn("Modificar").setCellEditor(
//                new ButtonEditor(new JCheckBox(), "/core/img/tablaactu.png", dev_tabla , c) );
        

        //cambio realizado (verificar que no altere buen funcionamiento)
        //agrega los botones a la columna que tenga definido como cabecera eliminar
        for (TableColumn tableColumn: dev_tabla.getColumns()) {
            if(tableColumn.getHeaderValue().equals("Eliminar")){
                tableColumn.setCellRenderer(new ButtonRenderer("/core/img/tabladel.png"));
                tableColumn.setCellEditor(
                        new ButtonEditor(new JCheckBox(), "/core/img/tabladel.png", dev_tabla, c));
                continue;
            }else if(tableColumn.getHeaderValue().equals("Consultar")){
                tableColumn.setCellRenderer(new ButtonRenderer("/core/img/tablaconsult.png"));
                tableColumn.setCellEditor(
                        new ButtonEditor(new JCheckBox(), "/core/img/tablaconsult.png", dev_tabla, c));
                continue;
            }else if(tableColumn.getHeaderValue().equals("Modificar")){
                tableColumn.setCellRenderer(new ButtonRenderer("/core/img/tablaactu.png"));
                tableColumn.setCellEditor(
                        new ButtonEditor(new JCheckBox(), "/core/img/tablaactu.png", dev_tabla, c));
                continue;
            }else if(tableColumn.getHeaderValue().equals("Cancelar")){
                tableColumn.setCellRenderer(new ButtonRenderer("/core/img/tabladel.png"));
                tableColumn.setCellEditor(
                        new ButtonEditor(new JCheckBox(), "/core/img/tabladel.png", dev_tabla, c));
                continue;
            }
        }
        
        //if(null != column){}

        //Asignarle botones para Compactar Contenido
        dev_tabla.setColumnControlVisible(true); 
        
        
        //Distingir Registros por Color 
        Highlighter simpleStriping = HighlighterFactory.createSimpleStriping();
        dev_tabla.setHighlighters(simpleStriping);
        
        
        
        
        
        
         //Centrar Titulos de Tabla
        ((DefaultTableCellRenderer) dev_tabla.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(
                SwingConstants.CENTER);
        
        
        //Hacer por Defecto tome el tamaño de la Tabla.
        dev_tabla.setHorizontalScrollEnabled(true);
        dev_tabla.packAll();
        
        modeloT = ed_modeloTabla;



    }

    
//    public boolean getScrollableTracksViewportWidth() {
//        if (autoResizeMode != AUTO_RESIZE_OFF) {
//            if (getParent() instanceof JViewport) {
//                return (((JViewport) getParent()).getWidth() > getPreferredSize().width);
//            }
//        }
//        return false;
//    }

    /**
     * Retorna Tabla con AnchoPredefinido 
     * @see  http://goo.gl/4q8gs
     * @param table
     * @param model
     * @return JTable con Ancho Automatico
     */
    public JTable autoResizeColWidth(JTable table, DefaultTableModel model) {
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setModel(model);

        int margin = 5;

        for (int i = 0; i < table.getColumnCount(); i++) {
            int vColIndex = i;
            DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel();
            TableColumn col = colModel.getColumn(vColIndex);
            int width = 0;

            // Get width of column header
            TableCellRenderer renderer = col.getHeaderRenderer();

            if (renderer == null) {
                renderer = table.getTableHeader().getDefaultRenderer();
            }

            Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0);

            width = comp.getPreferredSize().width;

            // Get maximum width of column data
            for (int r = 0; r < table.getRowCount(); r++) {
                renderer = table.getCellRenderer(r, vColIndex);
                comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, vColIndex), false, false,
                        r, vColIndex);
                width = Math.max(width, comp.getPreferredSize().width);
            }

            // Add margin
            width += 2 * margin;

            // Set the width
            col.setPreferredWidth(width);
        }

        ((DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(
                SwingConstants.LEFT);

        // table.setAutoCreateRowSorter(true);
        table.getTableHeader().setReorderingAllowed(false);

        return table;
    }
}